package com.qf.controller;

import com.qf.form.SmsInterfaceForm;
import com.qf.service.SmsInterfaceService;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/sms")
@Slf4j
public class SmsController {

    @Value("${ip-header}")
    private List<String> ipHeaders;

    @Autowired
    private SmsInterfaceService smsInterfaceService;

    /**
     *接收用户方项目，发给nginx做负载均衡，nginx将发送的短信数据，发到这里
     */
    @RequestMapping("/smsInterface")
    public Map smsInterface(SmsInterfaceForm smsInterfaceForm, HttpServletRequest request){

        //1. 获取用户请求中的携带的IP地址
        String ip = getRealIpAddress(request);

        //2. 将IP地址放到短信对象中封装
        smsInterfaceForm.setIp(ip);

        //3. 对各种参数进行非空效验
        Map resultMap = checkNotNull(smsInterfaceForm);

        if (resultMap != null){
            log.info("[接口模块 - 接口客户请求] 参数非空校验失败! resultMap = {}, interfaceForm= {}", resultMap, smsInterfaceForm);
            return resultMap;
        }

        //4. 调用service，做进一步效验，和短信对象中的数据初始化工作
        resultMap = smsInterfaceService.checkInterfaceForm(smsInterfaceForm);

        //5. 根据service的返回结果反馈给对象
        return resultMap;
    }

    /**
     * 效验短信对象中的属性不为空
     * @param smsInterfaceForm
     * @return
     */
    private Map checkNotNull(SmsInterfaceForm smsInterfaceForm){
        Map<String,Object> resultMap = new HashMap<>();

        if (StringUtils.isEmpty(smsInterfaceForm.getClientID())){
            resultMap.put("code", "101");
            resultMap.put("msg", "认证错误：clientId错误");
            return resultMap;
        }

        if (StringUtils.isEmpty(smsInterfaceForm.getPwd())) {
            resultMap.put("code", "102");
            resultMap.put("msg", "密码错误");
            return resultMap;
        }

        if (StringUtils.isEmpty(smsInterfaceForm.getIp())) {
            resultMap.put("code", "103");
            resultMap.put("msg", "IP校验错误");
            return resultMap;
        }

        if (StringUtils.isEmpty(smsInterfaceForm.getContent())) {
            resultMap.put("code", "104");
            resultMap.put("msg", "消息长度错，为空或超长（目前定为500个字）");
            return resultMap;
        }

        if (StringUtils.isEmpty(smsInterfaceForm.getMobile())) {
            resultMap.put("code", "105");
            resultMap.put("msg", "手机号错误");
            return resultMap;
        }

        if (StringUtils.isEmpty(smsInterfaceForm.getSrcID())) {
            resultMap.put("code", "106");
            resultMap.put("msg", "下行编号（srcID）错误");
            return resultMap;
        }

        return null;
    }

    /**
     * 获取对象中的IP地址
     * 这个请求可能被nginx代理或负载均衡
     * @param request
     * @return
     */
    private String getRealIpAddress(HttpServletRequest request){
        //1. 遍历nginx中代理请求的属性名称
        if (ipHeaders != null){
            for (String ipHeader : ipHeaders) {
                //2. 判断请求头不为空
                if (!StringUtils.isEmpty(ipHeader) && ipHeader.length() > 0){
                    //3. 获取nginx代理真实ip地址
                    String ip = request.getHeader(ipHeader);

                    //4. 判断是否真正拿到了IP地址
                    if (!StringUtils.isEmpty(ip) && !"unknow".equalsIgnoreCase(ip)){
                        //5. 返回
                        return ip;
                    }
                }
            }
        }

        //6. 如果循环结束还没有拿到ip  认为没有被nginx代理  则正常获取ip地址
        return request.getRemoteAddr();
    }
}
